package main

import (
	"fmt"
	"reflect"
	"strconv"
)

type Data[T any, T2 any] struct {
	x    T
	x2   T2
	name string
}

// Data自己的方法
func (data Data[T1, T2]) test() {
	fmt.Println(data)
}

// XStr Data自己的方法：解析X
func (data Data[T, T2]) XStr() string {
	reflectVal := reflect.ValueOf(data.x)

	if reflectVal.Kind() == reflect.Ptr {
		reflectVal = reflectVal.Elem()
	}

	switch reflectVal.Kind() {
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
		return strconv.FormatInt(reflectVal.Int(), 10)
	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
		return strconv.FormatUint(reflectVal.Uint(), 10)
	case reflect.Float32, reflect.Float64:
		return strconv.FormatFloat(reflectVal.Float(), 'f', -1, reflectVal.Type().Bits())
	default:
		return ""
	}
}

func main() {
	Data[any, any]{x: 1, name: "小张"}.test()
	Data[any, any]{x: "瓜子", x2: "包子", name: "小张"}.test()
	Data[any, any]{x: 1, x2: "包子", name: "小张"}.test()

	println(Data[any, any]{x: 1, x2: "包子", name: "小张"}.XStr())
}
